////////////////////////////////////////////////////////////////////////////////

#ifndef _SERVERENGINE_H_
#include "serverengine.h"
#endif

////////////////////////////////////////////////////////////////////////////////

#ifndef _SERVER_H_
#include "server.h"
#endif

#ifndef _TIMER_H_
#include "timer.h"
#endif

#ifndef _CLIENTINPUTPACKET_H_
#include "clientinputpacket.h"
#endif

////////////////////////////////////////////////////////////////////////////////


ServerEngine::ServerEngine()
: m_Server(NULL)
{
}


////////////////////////////////////////////////////////////////////////////////


ServerEngine::~ServerEngine()
{
}


////////////////////////////////////////////////////////////////////////////////


void ServerEngine::Start( Server* _server )
{
    m_Server = _server;
}


////////////////////////////////////////////////////////////////////////////////


void ServerEngine::UpdateState()
{
    size_t dt = GetTimeDiffFromPrevUpdate();

    if (dt > 0)
        m_Battlefield.Update(dt);
}


////////////////////////////////////////////////////////////////////////////////


void ServerEngine::UpdateClientInput( int _clientID, const ClientInputPacket& _clientInputPacket )
{
    m_Battlefield.SetClientInput( _clientID,
                                  _clientInputPacket.GetClientInput(),
                                  _clientInputPacket.GetCreationTime() );
}


////////////////////////////////////////////////////////////////////////////////


void ServerEngine::UpdateClientInfo( int _clientID, const ClientInfoPacket& _clientInfoPacket )
{
    Player* player = m_Battlefield.FindPlayer(_clientID);

    if (!player)
        m_Battlefield.AddPlayer(_clientID);
}


////////////////////////////////////////////////////////////////////////////////


ServerState ServerEngine::GetState() const
{
    return m_Battlefield.GetState();
}


////////////////////////////////////////////////////////////////////////////////


size_t ServerEngine::GetTimeDiffFromPrevUpdate() const
{
    // Previous time
    static size_t prevTime = Timer::GetCurrTime();

    // Current time
    size_t currTime = Timer::GetCurrTime();

    // Get difference
    size_t dt = currTime - prevTime;

    // Save previous time
    prevTime = currTime;

    // Return difference
    return dt;
}


////////////////////////////////////////////////////////////////////////////////


void ServerEngine::RemoveClient( int _clientID )
{
    m_Battlefield.RemovePlayer(_clientID);
}


////////////////////////////////////////////////////////////////////////////////
